﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HardMobCommons;
using System.Data.Entity;
using HardMobCommons.Entidades;

namespace HardMobInfra
{
	public class UnitOfWork : IDisposable
	{
		private bool disposed;
		private readonly TopicInfoContext contexto;

		private GenericRepository<Topico> _topicos;
		private GenericRepository<Usuario> _usuarios;
		private GenericRepository<RegistroDebug> _registroDebug;

		public UnitOfWork()
		{
			contexto = new TopicInfoContext();
		}

		public UnitOfWork(TopicInfoContext contexto)
		{
			this.contexto = contexto;
		}

		public GenericRepository<RegistroDebug> RegistrosDebug
		{
			get
			{
				DbSet<RegistroDebug> db = contexto.Set<RegistroDebug>();
				if (_registroDebug == null)
					_registroDebug = new GenericRepository<RegistroDebug>(contexto, db);

				return _registroDebug;
			}
		}

		public GenericRepository<Topico> Topicos
		{
			get
			{
				DbSet<Topico> db = contexto.Set<Topico>();
				if (_topicos == null)
					_topicos = new GenericRepository<Topico>(contexto, db);

				return _topicos;
			}
		}

		public GenericRepository<Usuario> Usuarios
		{
			get
			{
				DbSet<Usuario> db = contexto.Set<Usuario>();
				if (_usuarios == null)
					_usuarios = new GenericRepository<Usuario>(contexto, db);

				return _usuarios;
			}
		}

		public void SalvarAlteracoes()
		{
			contexto.SaveChanges();
		}

		private void Dispose(bool disposing)
		{
			if (disposed)
			{
				if (disposing)
				{
					contexto.Dispose();
				}
			}
			disposed = true;
		}

		public void Dispose()
		{
			this.Dispose(true);
			GC.SuppressFinalize(this);
		}
	}
}
